/**
 * 公共数据结构定义
 * 包含所有微服务共享的数据类型和错误码
 */
namespace go common

// 全局错误码（需覆盖所有服务场景）
enum ErrorCode {
    SUCCESS = 0,                // 操作成功
    USER_EXISTS = 1001,         // 用户名已存在
    AUTH_FAILED = 1002,         // 认证失败
    TICKET_NOT_FOUND = 2001,    // 票务记录不存在
    SEAT_UNAVAILABLE = 2002,    // 座位不可用（冲突或售罄）
    CONCURRENCY_CONFLICT = 2003,// 并发冲突（乐观锁校验失败）
    PERMISSION_DENIED = 3001,   // 管理员权限不足
    INVALID_SEAT = 3002,        // 无效的座位选择
    INVALID_DATE = 3003         // 无效的日期格式
}

// 通用业务异常结构
exception BizException {
    1: required ErrorCode errorCode, // 错误码类型
    2: required string message       // 错误详情（开发调试用）
}

// 车站信息传输对象
struct StationDTO {
    1: required i32 stationId,      // 车站唯一ID（数据库自增）
    2: required string stationName, // 标准车站名称（如"广州南站"）
    3: required string city,        // 所属城市（用于快速检索）
    4: required string region       // 所属大区（用于路由决策）
}

// 座位详细信息传输对象
struct SeatDTO {
    1: required i32 seatId,         // 物理座位唯一标识
    2: required string trainNumber, // 冗余车次编号（优化查询）
    3: required string carriageNumber, // 车厢编号（如"03"）
    4: required string seatNumber,  // 座位编号（如"A12F"）
    5: required string seatType,    // 座位类型（一等座/二等座/商务座）
    6: required double seatPrice,   // 座位基准票价
    7: required i32 startStationID, // 出发站ID
    8: required i32 endStationID,   // 到达站ID
    9: required string travelDate,  // 乘车日期（格式：yyyy-MM-dd）
    10: required double price,       // 该座位实际售价
    11: required string orderID,      // 关联订单号
    12: required i32 UserId, //座位绑定的用户ID
    13: required string Status //座位状态
}
// 订单详细信息传输对象
struct OrderDTO {
    1: required i32 orderId,       // 订单号（业务生成，如"O20240220123456"）
    2: required i64 userId,           // 关联用户ID
    3: required list<SeatDTO> seats,  // 包含的具体座位
    4: required string travelDate,    // 乘车日期（格式：yyyy-MM-dd）
    5: required string status,        // 订单状态（待支付/已支付/已退票）
    6: required double totalAmount    // 订单总金额
    7: required string CreateAt
}

// 购票请求结构（需包含座位选择）
struct PurchaseRequest {
    1: required i64 userId,          // 用户身份标识（从JWT解析）
    2: required list<i32> seatIds,   // 选择的座位ID列表
    3: required i32 startStationId,  // 出发站ID（防篡改校验）
    4: required i32 endStationId,    // 到达站ID
    5: required string travelDate,   // 乘车日期（格式：yyyy-MM-dd）
    6: required string authToken     // JWT认证令牌
}

// 退票请求结构
struct RefundRequest {
    1: required int32 orderId,      // 待退订单号
    2: required list<i32> seatIds,   // 需要退的座位ID（可部分退）
    3: required string authToken,     //用户令牌
}

// 强制同步请求结构
struct SyncRequest {
    1: required string region,       // 目标同步区域
    2: required list<i32> seatIds,   // 需要同步的座位状态
    3: required string operatorToken // 操作员令牌
}
